UsernameToken এবং PasswordToken Authentication হল ওয়েব সার্ভিসের নিরাপত্তা নিশ্চিত করার একটি জনপ্রিয় পদ্ধতি, যা মূলত SOAP প্রোটোকল ব্যবহারকারী ওয়েব সার্ভিসগুলোর মধ্যে নিরাপত্তা নিশ্চিত করতে ব্যবহৃত হয়। এই নিরাপত্তা পদ্ধতি SOAP মেসেজে একটি বিশেষ হেডার তৈরি করে, যাতে ব্যবহারকারীর ইউজারনেম (Username) এবং পাসওয়ার্ড (Password) প্রদান করা হয়।
Apache CXF এ UsernameToken এবং PasswordToken Authentication এর মাধ্যমে SOAP ওয়েব সার্ভিসে নিরাপত্তা যোগ করা যায়। এটি সাধারণত WS-Security (Web Services Security) স্ট্যান্ডার্ডের একটি অংশ হিসেবে ব্যবহৃত হয়।
UsernameToken একটি নিরাপত্তা টোকেন যা SOAP মেসেজের মধ্যে ইউজারনেম এবং পাসওয়ার্ডকে অন্তর্ভুক্ত করে। এটি প্রধানত ব্যবহারকারীর পরিচয় যাচাই করার জন্য ব্যবহৃত হয়। WS-Security স্ট্যান্ডার্ডের আওতায় এটি ব্যবহৃত হয়, যা ওয়েব সার্ভিসের মধ্যে নিরাপত্তা নিশ্চিত করে।
PasswordToken ব্যবহারকারীর পাসওয়ার্ডের জন্য একটি নিরাপত্তা টোকেন হিসেবে কাজ করে এবং এটি সাধারণত Plaintext বা Digest পদ্ধতিতে প্রেরিত হয়।
UsernameToken এবং PasswordToken Authentication মূলত দুটি উপাদান:
UsernameToken
এর মধ্যে পাসওয়ার্ড ধারণ করে এবং এটি সাধারণত একটি শুধুমাত্র-এনক্রিপ্টেড অথবা ডাইজেস্ট পদ্ধতিতে প্রেরিত হয়।নিরাপত্তার জন্য সাধারণত WS-Security Header ব্যবহার করা হয়, যা SOAP মেসেজে ইউজারনেম এবং পাসওয়ার্ড অন্তর্ভুক্ত করে এবং সার্ভার যাচাই করে। এই পদ্ধতিতে পাসওয়ার্ডের এনক্রিপশন বা ডাইজেস্ট ভ্যালিডেশন প্রয়োগ করা যেতে পারে, যা ট্রান্সমিশনের নিরাপত্তা নিশ্চিত করে।
Apache CXF তে WS-Security কনফিগারেশন করার মাধ্যমে UsernameToken এবং PasswordToken Authentication সহজেই বাস্তবায়ন করা যায়। নিচে এর কনফিগারেশন পদক্ষেপগুলো দেওয়া হলো:
প্রথমে cxf.xml
ফাইলে WS-Security কনফিগারেশন করতে হবে। এখানে আমরা UsernameToken এবং PasswordToken যোগ করব।
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:wssec="http://cxf.apache.org/configuration/wssecurity">
<bean id="securityInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<property name="securityEnvironment" value="org.apache.cxf.ws.security.wss4j.DefaultSecurityEnvironment" />
<property name="actions" value="UsernameToken" />
<property name="passwordCallbackClass" value="com.example.PasswordCallbackHandler" />
</bean>
<bean id="client" class="org.apache.cxf.jaxws.EndpointImpl">
<property name="address" value="http://localhost:8080/helloWorld"/>
<property name="interceptors">
<list>
<ref bean="securityInterceptor" />
</list>
</property>
</bean>
</beans>
এখানে:
UsernameToken
: এই নিরাপত্তা অ্যাকশনটি SOAP মেসেজে ইউজারনেম এবং পাসওয়ার্ড যাচাই করে।passwordCallbackClass
: এটি ব্যবহারকারীর পাসওয়ার্ড যাচাই করার জন্য ক্লাসের রেফারেন্স।WSS4JInInterceptor
: এটি ওয়েব সার্ভিসে ইনকামিং মেসেজে নিরাপত্তা চেক করে।PasswordCallbackHandler
ক্লাসটি পাসওয়ার্ড যাচাইয়ের জন্য ব্যবহার করা হয়। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে পাসওয়ার্ড যাচাই করার জন্য গুরুত্বপূর্ণ।
import org.apache.cxf.ws.security.wss4j.callback.PasswordCallback;
import org.apache.ws.security.WSConstants;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;
public class PasswordCallbackHandler implements CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (Callback callback : callbacks) {
if (callback instanceof PasswordCallback) {
PasswordCallback passwordCallback = (PasswordCallback) callback;
if (passwordCallback.getPrompt().equals("Password for user: testuser")) {
passwordCallback.setPassword("testpassword");
}
}
}
}
}
এখানে:
Client-side এ, আপনাকে SOAP মেসেজে ইউজারনেম এবং পাসওয়ার্ড অন্তর্ভুক্ত করতে হবে। Apache CXF-এ এই কাজটি নিচের মতো করতে হয়।
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import java.util.HashMap;
import java.util.Map;
public class Client {
public static void main(String[] args) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(HelloWorld.class);
factory.setAddress("http://localhost:8080/helloWorld");
HelloWorld client = (HelloWorld) factory.create();
// Create security context
Map<String, Object> outProps = new HashMap<>();
outProps.put("action", "UsernameToken");
outProps.put("passwordType", "PasswordText");
outProps.put("username", "testuser");
outProps.put("password", "testpassword");
WSS4JOutInterceptor securityInterceptor = new WSS4JOutInterceptor(outProps);
factory.getInInterceptors().add(securityInterceptor);
// Call the service
String response = client.sayHello("World");
System.out.println("Response: " + response);
}
}
এখানে:
WSS4JOutInterceptor
: এটি SOAP মেসেজের আউটপুটে নিরাপত্তা টোকেন যোগ করার জন্য ব্যবহৃত হয়।username
, password
: এখানে ইউজারনেম এবং পাসওয়ার্ড সরবরাহ করা হয়েছে।Server-side এ, ওয়েব সার্ভিসের মেথডে পাসওয়ার্ড যাচাই করা হবে। আপনাকে সার্ভার সাইডে একটি নিরাপত্তা কনফিগারেশন করতে হবে যাতে ইনকামিং SOAP মেসেজের ইউজারনেম এবং পাসওয়ার্ড যাচাই করা হয়।
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.apache.cxf.interceptor.InInterceptors;
import javax.jws.WebService;
@WebService
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
এখানে:
Apache CXF তে UsernameToken এবং PasswordToken Authentication ব্যবহারের মাধ্যমে SOAP ওয়েব সার্ভিসে নিরাপত্তা নিশ্চিত করা সম্ভব। এই প্রক্রিয়াতে সার্ভার এবং ক্লায়েন্ট উভয় দিকেই নিরাপত্তা কনফিগারেশন করতে হয়, যাতে মেসেজের ইউজারনেম এবং পাসওয়ার্ড যাচাই করা যায়।